#include <stdio.h>

int main(int argc, const char *argv[])
{
	// 字符数组：每个元素都是一个字符类型的数组
	char s1[5] = {'a', 'b', 99, 'd', 'e'};
	// 遍历字符数组
	int i = 0;
	for(i = 0; i < 5; i++){
		printf("%c", s1[i]);
	}
	printf("\n");

	// 也可以使用字符类型数组来保存字符串
	// 但是要注意 每个字符串结尾都有一个 '\0' 来标识字符串结束
	// 记得定义数组时 给 '\0' 留一个字节的空间
	// 有下面的写法
	char s2[6] = {"hello"}; // 写法1
	printf("s2 = [%s]\n", s2); // hello
	char s3[6] = "ABCDE";	// 写法2 ----常用的写法
	printf("s3 = [%s]\n", s3); // ABCDE
	char s4[] = "www.baidu.com";	// 写法3：这种写法
							// 操作系统在计算所需内存时 会将'\0' 算进去
	printf("s4 = [%s]\n", s4); // www.baidu.com
	printf("sizeof(s4) = %ld\n", sizeof(s4)); // 14

	// 注意:如果不是字符串就不能使用%s输出 
	// 因为%s会从首地址开始一直向后输出字符 知道遇到 '\0' 结束
	printf("s1 = [%s]\n", s1); // 结果 不可预知

	char s5[6] = {'a', 'b', 99, 'd', 'e'};
	printf("s5 = [%s]\n", s5); // abcde  
	// 因为数组不完全初始化时会用 0 来初始化 而 0 就是 '\0' 

	// 有的同学想定义数组来存储字符串 但是不确定要存什么字符串
	// 就先用{0}来初始化一下
	char s6[] = {0}; // 这行代码语法正确 但是要注意 操作系统只会给s6分配1个字节
	// 下面的代码有两处错误：1.数组名是常量 不能被赋值  2.越界访问
	// 因为s6只有1字节
	//s6 = "beijing";
	
	printf("------------------------------------\n");

	// 字符数组 和 字符串 的区别：
	// 字符串要求结尾必须有一个'\0'  字符数组不强制要求

	// 要特别注意区分 :  0   '0'  '\0'
	// 0 和 '\0' 一样  ascii码都是 0
	// '0' ascii码是 48
	char s7[] = "hello world";
	s7[5] = 0;
	printf("s7 = [%s]\n", s7); // hello

	char s8[] = "hello world";
	s8[5] = '\0';
	printf("s8 = [%s]\n", s8); // hello

	char s9[] = "hello world";
	s9[5] = '0';
	printf("s9 = [%s]\n", s9); // hello0world

	return 0;
}
